package com.tedu.api.thread;

/**
 * 线程常用API:四
 * join()    线程同步
 * 作用:允许一个线程在另外一个线程上等待,执行完毕上一个线程,执行当前线程!
 *
 * join常用在线程协调之间同步操作!
 *
 * 同步运行:执行先后顺序
 * 异步运行:执行代码没有先后顺序,各自执行自己的代码块(多线程)
 *
 * 需求:模拟下载功能:下载"图片"---1%~100%---单一流程:线程---共享状态变量
 *                 [下载完毕之后]
 *                 显示"图片"---单一流程:线程---共享状态变量
 *    同步运行:执行完毕下载图片操作,显示图片操作
 */
public class Thread_join {
    //图片是否下载完毕,共享状态变量--线程同步  true下载完毕  false没有下载
    public static boolean isFinish =false;

    public static void main(String[] args) {
        //1.创建下载线程,功能:1%~100%  下载百分比 download
        System.out.println("下载:开始下载图片");
        Thread download=new Thread(()->{
            for(int i=1;i<=100;i++) {
                System.out.println("下载" + i + "%");
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            isFinish=true;//当百分比为100%   下载状态改为true 下载完毕
            System.out.println("准备显示图片中...");
        });
        download.start();
        //创建显示线程,功能:显示图片  下载完毕之后显示  show
        System.out.println("准备显示图片中....");
        Thread show=new Thread(()->{
         //2.在显示图片前,必须下载完毕图片
            try {
                download.join();//同步:先执行download再执行show
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //3.如果图片没有下载完毕,---提示:打开失败,主动抛出异常
            if (!isFinish){ //false--图片正常下载--提示
                throw new RuntimeException("加载图片失败");
            }
            System.out.println("恭喜:图片加载完毕~");
        });
        show.start();
    }
}
